// WebSocketService.js
// 这是一个封装 WebSocket 的服务类，用于管理 WebSocket 的连接、消息发送和接收

export default class WebSocketService {
    /**
     * 构造函数
     * @param {string} url - WebSocket 的连接地址
     */
    constructor(url) {
        this.ws = null; // WebSocket 实例
        this.url = url; // WebSocket 服务器的地址
        this.reconnectInterval = 5000; // 自动重连的间隔时间（毫秒）
        this.shouldReconnect = true; // 是否开启自动重连
        this.messageQueue = []; // 消息队列，用于存储待发送的消息
        this.reconnectTimeout = null; // 用于存储重连的定时器
    }

    /**
     * 建立 WebSocket 连接
     * 连接成功后，会自动注册事件处理器，并尝试发送队列中的消息。
     */
    connect() {
        // 创建 WebSocket 实例
        this.ws = new WebSocket(this.url);

        // 监听 WebSocket 打开事件
        this.ws.onopen = () => {
            console.log('WebSocket连接成功');
            // 连接成功后，清空消息队列
            this.flushMessageQueue();
        };

        // 监听 WebSocket 收到消息事件
        this.ws.onmessage = (event) => {
            console.log('收到消息：', event.data);
        };

        // 监听 WebSocket 发生错误事件
        this.ws.onerror = (error) => {
            console.error('WebSocket错误：', error);
        };

        // 监听 WebSocket 连接关闭事件
        this.ws.onclose = () => {
            console.log('WebSocket连接关闭');
            // 如果允许自动重连，则尝试重新连接
            if (this.shouldReconnect) {
                console.log('尝试重新连接...');
                this.scheduleReconnect();
            }
        };
    }

    /**
     * 计划重新连接
     */
    scheduleReconnect() {
        if (this.reconnectTimeout) {
            clearTimeout(this.reconnectTimeout);
        }
        this.reconnectTimeout = setTimeout(() => {
            this.connect();
        }, this.reconnectInterval);
    }

    /**
     * 发送消息到 WebSocket 服务器
     * 如果连接未建立，将消息存入队列中。
     * @param {string} message - 要发送的消息
     */
    send(message) {
        if (this.ws && this.ws.readyState === WebSocket.OPEN) {
            this.ws.send(message); // 连接已建立，直接发送消息
        } else {
            console.warn('WebSocket未连接，消息存入队列：', message);
            this.messageQueue.push(message); // 连接未建立，将消息加入队列
        }
    }

    /**
     * 清空消息队列，依次发送消息
     */
    flushMessageQueue() {
        while (this.messageQueue.length > 0) {
            const message = this.messageQueue.shift();
            this.send(message);
        }
    }

    /**
     * 主动关闭 WebSocket 连接，并关闭自动重连机制
     */
    close() {
        this.shouldReconnect = false; // 禁止自动重连
        if (this.ws) {
            this.ws.close(); // 调用 WebSocket 的 close 方法关闭连接
        }
        if (this.reconnectTimeout) {
            clearTimeout(this.reconnectTimeout); // 清除重连定时器
        }
    }
}
